package pers.tz.题目;

/**
 * 打印一个数字的二进制
 * @author irony
 * @date 2024-03-09
 */
public class 十进制转二进制 {

    public static void main(String[] args) {
        int num1 = 1;
        int num2 = 2;
        int num3 = 10;
        int num4 = 821618;

        printB(num1); // 00000000000000000000000000000001
        printB(num2); // 00000000000000000000000000000010
        printB(num3); // 00000000000000000000000000001010
        printB(num4); // 00000000000011001000100101110010

        // 对于负数的二进制
        int num5 = -1;
        printB(num5); // 11111111111111111111111111111111
        printB(Integer.MIN_VALUE);
        // 取反+1得到相反数，对于+、-、*、/、%等，底层都是翻译为二进制去执行
        printB(~num5 + 1); // 00000000000000000000000000000001

        int a = 123;
        int b = 321;
        printB(a);
        printB(b);

        printB(a | b); // 或
        printB(a & b); // 与
        printB(a ^ b); // 异或

        printB(Integer.MIN_VALUE);
        printB(Integer.MIN_VALUE >> 1); // 带符号右移一位
        printB(Integer.MIN_VALUE >>> 1); // 不带符号右移一位

        // 正数取反+1都有负数对应
        printB(Integer.MAX_VALUE);
        printB(~Integer.MAX_VALUE + 1);

        // 负数最小取反没有正数对应
        printB(Integer.MIN_VALUE);
        printB(~Integer.MIN_VALUE + 1); // 还是它自己
    }


    /**
     * 十进制Int转二进制
     * @param num
     */
    public static void printB(int num) {
        // 遍历位数
        for (int i = 31; i >= 0; i--) {
            // 将1左移i位，然后与num与运算，得出num该位置的二进制是否是1
            // 如果是1，那么num与运算后，其他位都是0
            // num就变成了：16、32、64、256...
            System.out.print((num & (1 << i)) == 0 ? 0 : 1);
        }
        System.out.println();
    }

}
